iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
Python

進擊的Python系列 第 22

Day20-迭代陣列與項目賦值

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20240823/201632579EfRaD8A5L.jpg
圖片來源:(https://forum.gamer.com.tw/Co.php?bsn=43473&sn=45361)

迭代陣列(Iterating over an array)

是在程式設計中一個常見的概念,它允許我們處理一個數據集合中的每個元素。在 NumPy中,經常需要對陣列進行迭代,對每個元素進行操作或提取特定的資訊

為何要迭代 NumPy 陣列?

  • 逐元素操作:對陣列中的每個元素進行相同的運算,例如:加、減、乘、除等
  • 尋找特定元素:查找陣列中符合特定條件的元素
  • 修改陣列內容:更新陣列中部分或全部元素的值
  • 建立新陣列:基於原陣列中的元素,創建一個新的陣列

迭代NumPy陣列方法

1.使用傳統的 for 迴圈

這是最直觀的方式,但對於大型陣列,效率可能較低

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

for i in range(len(arr)):
    print(arr[i])

2.使用 NumPy 的 nditer

nditer提供了一個更靈活的方式來迭代多維陣列,可以控制迭代順序、複雜的索引等

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])

for x in np.nditer(arr):
    print(x)

3.利用向量化運算

NumPy強大之處在向量化運算,盡量避免使用 Python 的 for 迴圈,而直接對整個陣列進行操作,這能大幅提升效率

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 將陣列中的每個元素乘以2
arr *= 2
print(arr)
# 使用 np.nditer
for x in np.nditer(arr):
    print(x)

# 向量化操作
result = arr * 2
print(result)

4.結合 where 函數

根據條件對陣列進行元素級的修改

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 將陣列中大於3的元素變成0
arr[arr > 3] = 0
print(arr)

5.列表推導式 (List Comprehension)

Python提供了列表推導式,可以更簡潔地創建新的列表

# 將陣列中的元素乘以 2
new_arr = [x * 2 for x in arr]

6.向量化函數

NumPy 提供了許多向量化函數,例如:np.sumnp.meannp.max,可以直接對整個陣列進行計算

# 計算陣列元素的總和
sum_of_elements = np.sum(arr)

選擇最佳迭代方式

  • 小陣列:for迴圈可能足夠
  • 大型陣列:向量化運算通常是最快的
  • 複雜迭代:nditer提供更多控制

注意事項

  • 盡量避免修改正在迭代的陣列:這可能導致不可預測的結果
  • 了解 NumPy 的廣播機制:這對於進行元素級的運算非常重要
  • 考慮使用向量化函數:NumPy 提供了大量的向量化函數,可以加速計算

尋找陣列中最大值

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 方法一:使用 for 迴圈
max_value = arr[0]
for x in arr:
    if x > max_value:
        max_value = x

# 方法二:使用 NumPy 的 max 函數(向量化)
max_value = np.max(arr)

print(max_value)

總結

迭代陣列是數據處理中非常基礎且重要的操作。選擇合適的迭代方法可以提高程式碼的效率和可讀性。在實際應用中,可以根據具體的需求和數據的規模來選擇不同的迭代方式


陣列項目賦值(為陣列中的元素指定新值)

在 Python 中,尤其是使用 NumPy 庫時,我們經常需要對陣列中的元素進行賦值,修改陣列的內容。這在數據處理、分析和機器學習等領域中是非常常見的操作

為什麼要對陣列項目賦值?

修改數據:更正錯誤數據、更新數據值
初始化數據:為新創建的陣列賦初始值
條件更新:根據特定條件更新部分元素的值

陣列項目賦值方法

1.直接索引賦值

這是最基本的方法,通過索引直接指定要修改的元素,並賦予新值

import numpy as np

# 創建一個陣列
arr = np.array([1, 2, 3, 4, 5])

# 修改第三個元素
arr[2] = 10

print(arr)  # 輸出:[1 2 10 4 5]

2.切片賦值

可以對一整片元素進行賦值

# 將後三個元素都改為 0
arr[2:] = 0
print(arr)  # 輸出:[1 2 0 0 0]

3.布林索引賦值

根據布林條件,對滿足條件的元素進行賦值

# 將所有大於 2 的元素改為 100
arr[arr > 2] = 100
print(arr)  # 輸出:[1 2 100 100 100]

4.花式索引賦值

使用整數陣列作為索引,可以對任意位置的元素進行賦值

# 將索引為 0、2、4 的元素改為 -1
indices = [0, 2, 4]
arr[indices] = -1
print(arr)  # 輸出:[-1  2 -1 100 -1]

多維陣列賦值

對於多維陣列,可以通過多個索引來指定要修改的元素

# 二維陣列
arr2d = np.array([[1, 2, 3], [4, 5, 6]])

# 修改第一行第二個元素
arr2d[0, 1] = 10
print(arr2d)

注意事項

賦值時,新值的形狀必須與被賦值的部分相容
對於大型陣列,使用向量化操作(布林索引)通常比迭代要快
修改原陣列:對於 NumPy 陣列,直接賦值會修改原陣列。如果不想修改原陣列,可以創建一個副本

將陣列中所有負數替換為 0

arr = np.array([-1, 2, -3, 4, -5])
arr[arr < 0] = 0
print(arr)  # 輸出:[0 2 0 4 0]

總結

陣列項目賦值是 NumPy 中非常常用的操作。通過掌握不同的賦值方法,可以靈活地對陣列進行修改,以滿足各種數據處理的需求


上一篇
Day19-讀取陣列
下一篇
Day20-修改陣列形狀與項目
系列文
進擊的Python36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言